package util;

import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;

/**
 * Created by IntelliJ IDEA.
 * User: Altair
 * Date: 16.03.12
 * Time: 15:21
 * To change this template use File | Settings | File Templates.
 */
public class importXLS {
    private SSTRecord sstrec;
    private String SheetName;

    /**
     *
     * @param in   - входной поток xls файла
     * @return   - список имен листов
     * @throws IOException
     */
    public ArrayList<String> impXLS_ListName (InputStream in) 
            throws IOException {



        HSSFWorkbook wb = new HSSFWorkbook(in);
        int c = wb.getNumberOfSheets();
        int i;
        int j=0;
        ArrayList<String> lst = new ArrayList<String>();
        for (i = 0; i<c; i++){
            Sheet sheet = wb.getSheetAt(i);
            lst.add(sheet.getSheetName());
           // System.out.println("Sheet " + i +" name " + sheet.getSheetName());


        }

       // System.out.println("done.");
        return lst;
    }

    /**
     *
     * @param in   - входной поток xls файла
     * @return      - список всех неповторяющихся имен атрибутов
     * @throws IOException
     */
    public ArrayList<String> impXLS_Attr_Name(InputStream in)
            throws IOException {

        HSSFWorkbook wb = new HSSFWorkbook(in);
        ArrayList<String> lst = new ArrayList<String>();
        int h = 1;


         
        for (int j = 0; j < wb.getNumberOfSheets(); j++){
            
        
            Sheet sheet = wb.getSheetAt(j);
            Row row_fist = sheet.getRow(0);
            Iterator<Cell> cell_row_fist = row_fist.iterator();
            while (cell_row_fist.hasNext()){
                Cell cell = cell_row_fist.next();
                if (!lst.contains(cell.getStringCellValue())) {
                    lst.add(cell.getStringCellValue());
                 //   System.out.println(" " + cell.getStringCellValue());

                }
            
        }
        }
        
        return  lst;
    }

    /**
     *
     * @param in      - входной поток xls файла
     * @param SheetNames - имя листа
     * @return - список имен всех объектов
     * @throws IOException
     */
    public ArrayList<String> impXLS_ObjName (InputStream in, String SheetNames)
            throws IOException{
        ArrayList<String> lst = new ArrayList<String>();
        int j=1;
        SheetName=SheetNames;



        String row_name = "Name";
        HSSFWorkbook wb = new HSSFWorkbook(in);
        int i= wb.getSheetIndex(SheetName);
        Sheet sheet = wb.getSheetAt(i);
        int Column_index = aceptColumnIndIndex(wb, row_name, SheetName);
        Iterator<Row> objName_it = sheet.iterator();
        objName_it.next();
        while (objName_it.hasNext()){
            Row row = objName_it.next();
            Cell cell = row.getCell(Column_index);
            lst.add(cell.getStringCellValue());
          //  System.out.println(" Obj_name =  " + cell.getStringCellValue());
        }


       // System.out.println("done.");
        return lst;
    }

    /**
     *
     * @param wb   - передается объект  HSSFWorkbook
     * @param name   - имя атрибута
     * @param sheetName - имя листа
     * @return  -1 если имени нет в листе, номер колонки с именем name
     * @throws IOException
     */
    private int aceptColumnIndIndex(HSSFWorkbook wb, String name, String sheetName)
            throws IOException{


        HSSFWorkbook wb_acept = wb;
        int i= wb_acept.getSheetIndex(SheetName);
        int j = -1;
        Sheet sheet = wb_acept.getSheetAt(i);
        Row row = sheet.getRow(0);
        Iterator<Cell> cell = row.iterator();
        while(cell.hasNext()){
            Cell cell_control = cell.next();
            if (cell_control.getStringCellValue().equals(name)) {
                j = cell_control.getColumnIndex();
            }


        }

        return j;
    }


    /**
     *
     * @param in     - входной поток файла xls
     * @param sheetName   имя листа
     * @return  - boolean  в зависимости от того были добавлены или нет
     *                      параметры всех объектов
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean impXLS_ObjParams (InputStream in, String sheetName)
            throws IOException, ClassNotFoundException, SQLException {
        boolean  flag = false;



        conectionDB con_out = new conectionDB();
        Connection con = null;
        workWithDB wDB = new workWithDB();
        HSSFWorkbook wb = new HSSFWorkbook(in);
        Sheet sheet = wb.getSheet(sheetName);
          Row row_fist = sheet.getRow(0);
          Iterator<Cell> cell_row_fist = row_fist.iterator();
          while (cell_row_fist.hasNext()){
             Cell cell = cell_row_fist.next();
              int i = cell.getColumnIndex();
              String column_name = cell.getStringCellValue();
              if (!column_name.equals("Name")) {
              Iterator<Row> atrName_it = sheet.iterator();
              atrName_it.next();
                  con = con_out.conect();
              while (atrName_it.hasNext()) {
                  Row row = atrName_it.next();
                  Cell cell_add = row.getCell(i);

                  if (cell.getCellType()!=0) {
                      /**
                       * сдесь добавляем полученный параметр в базу с помощью соотв метода
                       * класса  workWithDB
                       * aceptColumnIndIndex("Name", wb, sheet.getSheetName()) - дает нам номер калонки с именем "Name"
                       * row.getCell(aceptColumnIndIndex("Name", wb, sheet.getSheetName())).getStringCellValue() - дает нам
                       * имя объекта.
                       * column_name - дает нам имя параметра.
                       */

                      wDB.addParam(""+cell_add.getNumericCellValue(),
                             row.getCell(aceptColumnIndIndex("Name", wb, sheet.getSheetName())).getStringCellValue(),
                              column_name, con);


                  }
                  else {

                      wDB.addParam(cell_add.getStringCellValue(),
                              row.getCell(aceptColumnIndIndex("Name", wb, sheet.getSheetName())).getStringCellValue(),
                              column_name, con);

                  }

              }
                  con.close();
              }
                  
              }
            flag = true;


        return flag;
    }

    /**
     *     получился второй метод идентичный  aceptColumnIndIndex
     * @param name   - имя колонки
     * @param wb_acept  - открытая HSSFWorkbook
     * @param sheetname  - имя листа
     * @return   -1 если имени нет в листе, номер колонки с именем name
     * @throws IOException
     */
    public int aceptColumnIndIndex(String name, HSSFWorkbook wb_acept, String  sheetname)
            throws IOException{

        int j = -1;
        Sheet sheet = wb_acept.getSheet(sheetname);
        Row row = sheet.getRow(0);
        Iterator<Cell> cell = row.iterator();
        try {
            while(cell.hasNext()){
                Cell cell_control = cell.next();
                if (cell_control.getStringCellValue().equals(name)) {
                    j = cell_control.getColumnIndex();
                }

            }
        } catch(NullPointerException ex) {}
        
        return j;
    }
    
    
    
}
